From 1283fe84f2499e1c1af242641fe9978f8140a498 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 19 Oct 2005 13:59:15 +0100 Subject: [PATCH] Add slack to balloon driver to allow to counteract low-mem address space allocations in backend drivers. Signed-off-by: Keir Fraser --- .../arch/xen/i386/kernel/setup.c | 46 ++++++------------- .../arch/xen/x86_64/kernel/e820.c | 9 ++-- .../arch/xen/x86_64/kernel/setup.c | 26 +++++------ .../drivers/xen/balloon/balloon.c | 5 +- 4 files changed, 33 insertions(+), 53 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c index 17788f3862..958e2af479 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c @@ -939,6 +939,8 @@ void __init find_max_pfn(void) if ( xen_override_max_pfn < xen_start_info->nr_pages ) xen_override_max_pfn = xen_start_info->nr_pages; max_pfn = xen_override_max_pfn; + /* 8MB slack, to make up for address space allocations in backends. */ + max_pfn += 8 << (20 - PAGE_SHIFT); } #endif /* XEN */ @@ -1638,39 +1640,17 @@ void __init setup_arch(char **cmdline_p) #endif /* Make sure we have a correctly sized P->M table. */ - if (max_pfn != xen_start_info->nr_pages) { - phys_to_machine_mapping = alloc_bootmem_low_pages( - max_pfn * sizeof(unsigned long)); - - if (max_pfn > xen_start_info->nr_pages) { - /* set to INVALID_P2M_ENTRY */ - memset(phys_to_machine_mapping, ~0, - max_pfn * sizeof(unsigned long)); - memcpy(phys_to_machine_mapping, - (unsigned long *)xen_start_info->mfn_list, - xen_start_info->nr_pages * sizeof(unsigned long)); - } else { - struct xen_memory_reservation reservation = { - .extent_start = (unsigned long *)xen_start_info->mfn_list + max_pfn, - .nr_extents = xen_start_info->nr_pages - max_pfn, - .extent_order = 0, - .domid = DOMID_SELF - }; - - memcpy(phys_to_machine_mapping, - (unsigned long *)xen_start_info->mfn_list, - max_pfn * sizeof(unsigned long)); - BUG_ON(HYPERVISOR_memory_op( - XENMEM_decrease_reservation, - &reservation) != - (xen_start_info->nr_pages - max_pfn)); - } - free_bootmem( - __pa(xen_start_info->mfn_list), - PFN_PHYS(PFN_UP(xen_start_info->nr_pages * - sizeof(unsigned long)))); - } - + phys_to_machine_mapping = alloc_bootmem_low_pages( + max_pfn * sizeof(unsigned long)); + memset(phys_to_machine_mapping, ~0, + max_pfn * sizeof(unsigned long)); + memcpy(phys_to_machine_mapping, + (unsigned long *)xen_start_info->mfn_list, + xen_start_info->nr_pages * sizeof(unsigned long)); + free_bootmem( + __pa(xen_start_info->mfn_list), + PFN_PHYS(PFN_UP(xen_start_info->nr_pages * + sizeof(unsigned long)))); /* * Initialise the list of the frames that specify the list of diff --git a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c index 32091d2496..6f9ab86b79 100644 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c @@ -528,10 +528,13 @@ unsigned long __init e820_end_of_ram(void) { unsigned long max_end_pfn = xen_start_info->nr_pages; - if ( xen_override_max_pfn < max_end_pfn) + if ( xen_override_max_pfn < max_end_pfn) xen_override_max_pfn = max_end_pfn; - - return xen_override_max_pfn; + + /* 8MB slack, to make up for address space allocations in backends. */ + xen_override_max_pfn += 8 << (20 - PAGE_SHIFT); + + return xen_override_max_pfn; } void __init e820_reserve_resources(void) diff --git a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c index 2df3585c08..19f5e957a5 100644 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c @@ -429,7 +429,7 @@ static __init void parse_cmdline_early (char ** cmdline_p) static void __init contig_initmem_init(void) { unsigned long bootmap_size = init_bootmem(start_pfn, end_pfn); - free_bootmem(0, end_pfn << PAGE_SHIFT); + free_bootmem(0, xen_start_info->nr_pages << PAGE_SHIFT); reserve_bootmem(HIGH_MEMORY, (PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1) - HIGH_MEMORY); @@ -734,19 +734,17 @@ void __init setup_arch(char **cmdline_p) { int i, j, k, fpp; /* Make sure we have a large enough P->M table. */ - if (end_pfn > xen_start_info->nr_pages) { - phys_to_machine_mapping = alloc_bootmem( - end_pfn * sizeof(unsigned long)); - memset(phys_to_machine_mapping, ~0, - end_pfn * sizeof(unsigned long)); - memcpy(phys_to_machine_mapping, - (unsigned long *)xen_start_info->mfn_list, - xen_start_info->nr_pages * sizeof(unsigned long)); - free_bootmem( - __pa(xen_start_info->mfn_list), - PFN_PHYS(PFN_UP(xen_start_info->nr_pages * - sizeof(unsigned long)))); - } + phys_to_machine_mapping = alloc_bootmem( + end_pfn * sizeof(unsigned long)); + memset(phys_to_machine_mapping, ~0, + end_pfn * sizeof(unsigned long)); + memcpy(phys_to_machine_mapping, + (unsigned long *)xen_start_info->mfn_list, + xen_start_info->nr_pages * sizeof(unsigned long)); + free_bootmem( + __pa(xen_start_info->mfn_list), + PFN_PHYS(PFN_UP(xen_start_info->nr_pages * + sizeof(unsigned long)))); /* * Initialise the list of the frames that specify the list of diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c index 984e6f9ad9..14a9718326 100644 --- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c +++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c @@ -502,7 +502,7 @@ static int dealloc_pte_fn( .extent_order = 0, .domid = DOMID_SELF }; - set_pte(pte, __pte_ma(0)); + set_pte_at(&init_mm, addr, pte, __pte_ma(0)); phys_to_machine_mapping[__pa(addr) >> PAGE_SHIFT] = INVALID_P2M_ENTRY; BUG_ON(HYPERVISOR_memory_op( @@ -521,10 +521,9 @@ struct page *balloon_alloc_empty_page_range(unsigned long nr_pages) scrub_pages(vstart, 1 << order); + balloon_lock(flags); BUG_ON(generic_page_range( &init_mm, vstart, PAGE_SIZE << order, dealloc_pte_fn, NULL)); - - balloon_lock(flags); current_pages -= 1UL << order; balloon_unlock(flags); -- 2.30.2